package com.jxtc.enterprise.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
 * 配置filter，对每一个请求进行处理，如果发现请求来自 允许跨域 的源，在请求的响应中添加标记，
 * 避免mvc框架的后续处理中，将该请求标记为跨域禁止的请求，导致在 响应头中添加 strict-origin-when-cross-origin，导致浏览器处理响应时报错
 */
@Configuration
public class GlobalCorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();

        // 本地测试时允许的跨域访问，端口放行一个范围，便于前端本地调试时可以使用不同的端口
        // 放行 8789 至 8798 共 10 个本地端口的跨域请求
        config.addAllowedOriginPattern("http://localhost:[8789,8790,8791,8792,8793,8794,8795,8796,8797,8798]");

        // 本地局域网同样放行 8789 至 8798 共 10 个本地端口的跨域请求，方便手机端实机测试
        // 由于不知道本地 npm run dev 后所使用的局域网 IP 地址，所以本地局域网中的 IP 地址的 8789 至 8798 端口均放行
        String baseIp0 = "192.168.0.";
        for (int i = 1; i <= 254; i++) {
            // 遍历 192.168.0.1 - 192.168.0.254
            for (int port = 8789; port <= 8798; port++) {
                // 遍历端口范围
                config.addAllowedOrigin("http://" + baseIp0 + i + ":" + port);
            }
        }
        String baseIp1 = "192.168.1.";
        for (int i = 1; i <= 254; i++) {
            // 遍历 192.168.1.1 - 192.168.1.254
            for (int port = 8789; port <= 8798; port++) {
                // 遍历端口范围
                config.addAllowedOrigin("http://" + baseIp1 + i + ":" + port);
            }
        }

        // 测试环境仅允许指定端口跨域：
        // - 6092 HR 管理平台
        // - 6093 租户管理平台
        // - 6096 管理员管理平台
        // - 6094 配送员 H5
        // - 6095 客户餐二维码跳转落地页
        config.addAllowedOrigin("https://hr.enterprise.qiyetuancan.com:6092");
        config.addAllowedOrigin("https://admin.enterprise.qiyetuancan.com:6093");
        config.addAllowedOrigin("https://admin.enterprise.qiyetuancan.com:6096");
        config.addAllowedOrigin("https://admin.enterprise.qiyetuancan.com:6094");
        config.addAllowedOrigin("https://admin.enterprise.qiyetuancan.com:6095");


        // 生产环境仅允许指定端口跨域：
        // - 9092 HR 管理平台
        // - 9093 租户管理平台
        // - 9096 管理员管理平台
        // - 9094 配送员 H5
        // - 9095 客户餐二维码跳转落地页
        config.addAllowedOrigin("https://hr.enterprise.qiyetuancan.com:9092");
        config.addAllowedOrigin("https://admin.enterprise.qiyetuancan.com:9093");
        config.addAllowedOrigin("https://admin.enterprise.qiyetuancan.com:9096");
        config.addAllowedOrigin("https://admin.enterprise.qiyetuancan.com:9094");
        config.addAllowedOrigin("https://admin.enterprise.qiyetuancan.com:9095");

        //允许跨域发送cookie
        config.setAllowCredentials(true);
        //放行全部原始头信息
        config.addAllowedHeader("*");
        //允许所有请求方法跨域调用，允许来自 addAllowedOrigin 添加的源的所有方式（GET, POST, PUT, DELETE 等）的请求
        config.addAllowedMethod("*");

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}
